package cn.tedu.api;
//测试 单例设计模式
//1私有化构造方法---不让别人new
//2 在自己类的内部，创建一个对象
//3提供公共的访问方法，并返回自己创建的对象
public class Test3_Singleton {
    public static void main(String[] args) {
        //TODO
//        Hello h = new Hello();
//        Hello h2 = new Hello();
        Hello h =Hello.get();
        Hello h2 =Hello.get();
        System.out.println(h==h2);
        Hello2 h3 =Hello2.get();
        Hello2 h4 =Hello2.get();
        System.out.println(h3==h4);


    }
}
class Hello2{//懒汉式--面试的重点！！！---按需加载---延迟加载---线程安全
    private Hello2(){}
    static  private Hello2 h;
    //TODO 共享资源h是静态的,而且被多条语句操作,肯定不安全.需要加锁.
    // 而且锁对象分配的必须是类名.class才安全
    //TODO 锁方法,普通方法的锁对象默认是this.静态方法的锁对象默认就是类名.class
        //TODO 锁代码块:想锁静态的共享资源,,锁对象必须也是类名.class
    synchronized static public Hello2 get(){
        if(h == null){
           h = new Hello2();//没new过，才new。
        }
        return h;
    }
}
class Hello{//饿汉式
    //1 私有化构造方法
    private Hello(){}
    //2 自己new一个
    static  private Hello hello= new Hello();//加static是因为要被静态的get()调用----静态只能调静态
    //3 提供一个方法，把hello返回
    //加static是因为这个类不能通过new对象来调用get
    static public Hello get(){
        return hello;//把自己创建好的hello对象返回调用位置
    }
}
